package com.example.himalaya.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.example.himalaya.R;
import com.example.himalaya.base.BaseApplication;

/**
 * UI加载器，根据UI状态加载不同页面
 */

public abstract class UILoader extends FrameLayout {

    private View mLoadingView;
    private View mSuccessView;
    private View mNetworkErrorView;
    private View mDataEmptyView;
    private OnRetryClickListener mOnRetryClickListener = null;

    public enum UIStatus{
        LOADING, //正在加载
        SUCCESS, //数据获取成功
        EMPTY, //数据为空
        NETWORK_ERROR, //网络错误
        NONE //无状态
    }

    public UIStatus mCurrentStatus = UIStatus.NONE;//当前状态

    public UILoader(@NonNull Context context) {
        //保证唯一入口
        this(context,null);
    }

    public UILoader(@NonNull Context context, @Nullable AttributeSet attrs) {
        //保证唯一入口
        this(context, attrs,0);
    }

    public UILoader(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initUI();
    }

    /**
     * 更新UI状态
     * @param status
     */
    public void updateUIStatus(UIStatus status) {
        mCurrentStatus = status;
        //更新UI一定要在主线程上
        BaseApplication.getHandler().post(new Runnable() {
            @Override
            public void run() {
                switchUIByCurrentStatus();
            }
        });
    }

    /**
     * 初始化UI
     * 相关View加载进来
     */
    private void initUI() {
        switchUIByCurrentStatus();
    }

    /**
     * 按当前状态切换 UI
     */
    private void switchUIByCurrentStatus() {
        //正在加载
        if (mLoadingView == null) {
            mLoadingView = getLoadingView();
            //添加正在加载视图到本类的FrameLayout中
            addView(mLoadingView);
        }
        //根据状态设置是否可见
        mLoadingView.setVisibility(mCurrentStatus==UIStatus.LOADING?VISIBLE:GONE);

        //加载成功
        if (mSuccessView == null) {
            mSuccessView = getSuccessView(this);
            //添加加载成功视图到本类的FrameLayout中
            addView(mSuccessView);
        }
        //根据状态设置是否可见
        mSuccessView.setVisibility(mCurrentStatus==UIStatus.SUCCESS?VISIBLE:GONE);

        //网路错误
        if (mNetworkErrorView == null) {
            mNetworkErrorView = getNetworkErrorView();
            //添加网络错误视图到本类的FrameLayout中
            addView(mNetworkErrorView);
        }
        //根据状态设置是否可见
        mNetworkErrorView.setVisibility(mCurrentStatus==UIStatus.NETWORK_ERROR?VISIBLE:GONE);

        //数据为空
        if (mDataEmptyView == null) {
            mDataEmptyView = getDataEmptyView();
            //添加数据为空视图到本类的FrameLayout中
            addView(mDataEmptyView);
        }
        //根据状态设置是否可见
        mDataEmptyView.setVisibility(mCurrentStatus==UIStatus.EMPTY?VISIBLE:GONE);

    }

    /**
     * 获取正在加载视图
     * @return
     */
    protected View getLoadingView() {
        return LayoutInflater.from(getContext()).inflate(R.layout.fragment_loading_view, this, false);
    }

    /**
     * 获取加载成功视图
     * 由于不同API接口请求，返回的内容也不同，为了通用性，
     * 所以使用抽象方法，交由子类实现，并提供成功页面
     * @param container 容器，用于成功内容RecyclerView在本类FrameLayout显示时，测绘使用
     * @return
     */
    protected abstract View getSuccessView(ViewGroup container);

    /**
     * 获取网路错误视图
     * @return
     */
    protected View getNetworkErrorView() {
        View networkErrorView=LayoutInflater.from(getContext()).inflate(R.layout.fragment_error_view, this, false);
        networkErrorView.findViewById(R.id.network_error_icon).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //重新获取数据
                if (mOnRetryClickListener != null) {
                    mOnRetryClickListener.onRetryClick();
                }
            }
        });
        return networkErrorView;
    }

    /**
     * 获取数据为空视图
     * @return
     */
    protected View getDataEmptyView() {
        return LayoutInflater.from(getContext()).inflate(R.layout.fragment_empty_view, this, false);
    }




    public void setOnRetryClickListener(OnRetryClickListener listener) {
        this.mOnRetryClickListener = listener;
    }

    public interface OnRetryClickListener {
        /**
         * 网路不佳的时候，用户点击重试
         */
        void onRetryClick();
    }

}
